var express = require('express');
const { findOne } = require('../model/user');
var router = express.Router();

var User = require("../model/user");
var { genToken, verifyToken } = require("../tool/jwt");

/* GET users listing. */

// users/
router.get('/', function (req, res, next) {
	console.log(req.query);
	res.send('respond with a resource');
});

// users/judgeUser
router.get('/judgeUser', async function (req, res, next) {
	var { user } = req.query;
	if (user) {
		try {
			var doc = await User.findOne({ user: user }); //对应用户名查询数据 -> 有就返回该对象,没有null
			if (!doc) {   //   doc == null  没有数据 
				res.json({
					status: 200,
					message: "可以使用的用户名"
				})
			} else { //有数据 ->  已被注册
				res.json({
					status: 400,
					message: "用户名已被注册"
				})
			}
		} catch (err) {
			res.json({
				status: 500,
				message: err.message
			})
		}
	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}
});


// users/judgePhone
router.get('/judgePhone', async function (req, res, next) {
	var { phone } = req.query;
	if (phone) {
		try {
			var doc = await User.findOne({ phone: phone }); //对应用户名查询数据 -> 有就返回该对象,没有null
			if (!doc) {   //   doc == null  没有数据 
				res.json({
					status: 200,
					message: "可以使用的手机号"
				})
			} else { //有数据 ->  已被注册
				res.json({
					status: 400,
					message: "手机号已被注册"
				})
			}
		} catch (err) {
			res.json({
				status: 500,
				message: err.message
			})
		}
	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}
});


router.get('/judgeEmail', async function (req, res, next) {
	var { email } = req.query;
	if (email) {
		try {
			var doc = await User.findOne({ email: email }); //对应用户名查询数据 -> 有就返回该对象,没有null
			if (!doc) {   //   doc == null  没有数据 
				res.json({
					status: 200,
					message: "可以使用的邮箱"
				})
			} else { //有数据 ->  已被注册
				res.json({
					status: 400,
					message: "邮箱已被注册"
				})
			}
		} catch (err) {
			res.json({
				status: 500,
				message: err.message
			})
		}
	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}
});






// users/add   注册接口(post)
router.post("/add", async function (req, res) {
	// 1. 接收前端传入的注册数据 (user pwd phone email) -> 需要数据才接收
	// post类型的接口不好直接测试?
	// a. 先用get方式测试接口 等接口测试完毕 -> 在改为post
	// b. 可以借助接口测试工具 => postman  apipost

	// 2. 将数据存储到mongodb数据库
	//    a. 链接mongodb
	//    b. 创建Schema(数据的接口) model(模型->映射集合(表))

	// 3. 根据结果给前端响应
	// status => true / false  只能记录两种状态

	// 多种
	// 0 => 2217_0
	// 1 => 2217_1
	// 2 => 2217_2

	// 100  请求还要继续
	// 200  请求结果成功
	// 300  参数不完整
	// 400  请求内容不存在  
	// 401  身份验证有误 
	// 500  数据库有误

	var { user, pwd, phone, email } = req.body;
	console.log(11111, user, pwd, phone, email);
	if (user && pwd && phone && email) {  //前端传了4条数据
		var isExistUser = await User.findOne({ user: user });
		// console.log(111111,isExistUser);
		if (isExistUser) {
			// 函数遇到return就结束了  => 返回响应结果,且代码不在向后转执行
			res.json({
				status: 400,
				message: "用户名已被注册"
			})
			return;
		}

		var isExistPhone = await User.findOne({ phone: phone });
		if (isExistPhone) {
			res.json({
				status: 400,
				message: "手机号已被注册"
			})
			return;
		}
		var isExistEmail = await User.findOne({ email: email });
		if (isExistEmail) {
			res.json({
				status: 400,
				message: "邮箱已被注册"
			})
			return;
		}

		// 用户 手机号 邮箱都不存在-> 直接注册
		User.insertMany({ user, pwd, phone, email }).then(() => {
			res.json({
				status: 200,
				message: "注册成功"
			})
		}).catch(err => {
			res.json({
				status: 500,
				message: err.message
			})
		})
	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}



})


// 登录功能(用户名和密码)
// 1. 接收前端传入的用户名和密码 (用户输入的)
// 2. 连接mongodb数据库 
//       a. 根据用户名查找数据是否存在
//       b. 如果用户存在 对比密码 
// 3. 根据查询的结果 向前端返回对应的结果
router.post("/login", async function (req, res) {
	var { user, pwd } = req.body;

	if (user && pwd) {
		var doc = await User.findOne({ user: user });
		if (doc) {
			if (pwd == doc.pwd) {
				res.json({
					status: 200,
					message: "登陆成功"
				})
			} else {
				res.json({
					status: 400,
					message: "登陆失败,用户名或密码有误"
				})
			}

		} else {
			res.json({
				status: 400,
				message: "该用户未注册"
			})
		}


	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}

})


// 登录功能(账号和密码)
// 1. 接收前端传入的账号和密码 (用户输入的)
// 2. 连接mongodb数据库 
//       a. 根据账号查找数据是否存在 (账号 -> 用户名,手机号,邮箱)
//       b. 如果用户存在 对比密码 
// 3. 根据查询的结果 向前端返回对应的结果
router.post("/loginAccount", async function (req, res) {
	var { account, pwd } = req.body;

	if (account && pwd) {
		var doc = await User.findOne({ $or: [{ user: account }, { phone: account }, { email: account }] });
		console.log(account, doc);
		if (doc) {
			if (pwd == doc.pwd) {
				var token = genToken({ _id: doc._id }, 30 * 60);

				res.json({
					status: 200,
					message: "登陆成功",
					// 账号登录  => 用户名,手机号,邮箱登录 => 前端可能不知道对应账号的用户名
					user: doc.user, //给前端标识用户身份
					token,  // 给后端验证身份
				})
			} else {
				res.json({
					status: 400,
					message: "登陆失败,用户名或密码有误"
				})
			}

		} else {
			res.json({
				status: 400,
				message: "该用户未注册"
			})
		}


	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}

})

// info页面显示用户基本信息 => 对应cookie中存储的数据

// router.post("/findInfo",async function(req,res){
// 	var {user} = req.body;
// 	console.log( req.body);
// 	if(user){
// 		var doc = await User.findOne({user},{__v:0,pwd:0});
// 		if(doc){
// 			res.json({
// 				status:200,
// 				message:"查询成功",
// 				data:doc,
// 			})
// 		}else{
// 			res.json({
// 				status:400,
// 				message:"暂无数据",
// 			})
// 		}

// 	}else{
// 		res.json({
// 			status: 300,
// 			message: "请传入完整参数"
// 		})
// 	}


// })


router.post("/findInfo", async function (req, res) {
	// 1. 接收请求头信息中携带的token

	// console.log( req.body);
	var { token } = req.body;

	if (token) {
		var data = verifyToken(token);
		if (data) {   // 验证成功
			var _id = data._id;
			var doc = await User.findById(_id, { __v: 0, pwd: 0 });
			if (doc) {
				res.json({
					status: 200,
					message: "查询成功",
					data: doc,
				})
			} else {
				res.json({
					status: 400,
					message: "暂无数据",
				})
			}
		} else {
			res.json({
				status: 401,
				message: "token已失效,请重新登录",
			})
		}




	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}







})


// 更新用户名
// 1. 接收前端以post方式传递的数据  ({lgc(老用户),user(新用户)})
// 2. 先判断新用户名是否已被注册 => 已被注册,不能注册  
// 3. 用户名没有注册  -> 更新数据

router.post("/updateUser", async function (req, res) {
	var { token, user } = req.body;

	if (token && user) {
		var data = verifyToken(token);
		if (data) {   // 验证成功
			var doc = await User.findOne({ user });
			if (!doc) {
				var _id = data._id;
				var oldDoc = await User.findByIdAndUpdate(_id, { user: user });
				if (oldDoc) {
					res.json({
						status: 200,
						message: "更新成功",
					})
				} else {
					res.json({
						status: 300,
						message: "查询用户不存在",
					})
				}

			} else {
				res.json({
					status: 400,
					message: "用户名已被使用"
				})
			}
		} else {
			res.json({
				status: 401,
				message: "token已失效,请重新登录",
			})
		}



	} else {
		res.json({
			status: 300,
			message: "请传入完整参数"
		})
	}

})


module.exports = router;
